实验原理
使用SPI协议,利用ARM控制数码显示管显示1到F,用串口检验发送的数据是否正确。
Proteus仿真电路图
image.png
C语言源程序
下面是主程序文件,串口部分的程序代码与“中断结合串口”相同,所以省略。
#include <LPC21XX.H>
  • #include "uart0.h"
  • #define   HC595_CS    0x00000100/*P0.8口为74HC595的片选*/
  • typedef unsigned int uint32;
  • typedef unsigned char uint8;
  • char status[] = "Everytnig is fine.";
  • uint8 const DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
  • 0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  • uint8 rcv_data;
  • void delay(void)  {                        
  •   unsigned volatile long i,j;
  •   for(i=0;i<10000;i++)
  •   for(j=0;j<30;j++)
  •   ;
  • }
  • void spiInit(void){
  •   S0SPCCR=0x52;           //设置SPI时钟分频
  •   S0SPCR=0x30;            //设置SPI接口模式
  • }
  • uint8 spiChar(uint8 data){
  •   IO0CLR=HC595_CS;                             //片选
  •   S0SPDR=data;
  •   while(0==(S0SPSR&0x80));                      //等待SPIF置位,即等待数据发送完毕
  •   IO0SET=HC595_CS;
  •   return(S0SPDR);
  • }
  • int  main(void){
  •   uint8 i;
  •   PINSEL0 = 0x00005505;/*引脚开串口SPI、UART0*/              
  •   IO0DIR=HC595_CS;
  •   spiInit();/*初始化SPI接口*/
  •   uart0Init();
  •   while(1){
  •     for (i=0;i<16;i++) {
  •                             if(i<10){putchar(i+'0');}
  •                                           else{putchar(i+7+'0');}
  •                             rcv_data=spiChar(DISP_TAB[ i]);/*发送显示数据*/
  •                             delay();
  •     }
  •               serialPuts(status);
  •   }
  • }
  • [ i]
  • 复制代码