当前位置:首页 > 东南大学MCU第三四次实验
图4-2实验开发板LED数码管对应关系图
TM1638的各引脚定义如图4-3所示。
图4-3TM1638各引脚定义
(2) TM1638接收数据
串行数据传输格式:读取和接收1个BIT都在时钟的上升沿操作。 数据接收(写数据)时序如图4-4所示。
图4-4TM1638数据接收时序图
以下写数据代码仅作为参考。(更多关于TM1638的程序请参考给出的TM1638.h和TM1638.c两个文件以及芯片说明书)
voidTM1638_Write(unsignedcharDATA)//写数据函数 {
unsignedchari; DIO_OUT;
//将DIO配置为输出状态
for(i=0;i<8;i++) {
CLK_low;
if(DATA&0x01) {
DIO_high; } else { DIO_low; }
CLK_high;
DATA>>=1;//数据左移一位 }
}
(3) LED数码管显示
图4-5共阴极数码管连接图
图4-5给出一个共阴数码管的连接示意图,如果让该数码管显示“0”,那你需要在GRID1为低电平的时候让SEG1,SEG2,SEG3,SEG4,SEG5,SEG6为高电平,SEG7为低电平,即在00H地址单元里面写数据3FH就可以让数码管显示“0”。
共阴极LED数码管编码如表4-1所示。
表4-1共阴极LED数码管编码表
0 3F
(4) 开发板上LED地址
开发板共有8个LED数码管,从左至右其地址分别为:08h,0ah,0ch,0eh,00h,02h,04h,06h。 例如:
constuint8_tDisp[8]={0,8,0,1,2,1,4,0};//要显示的学号
constuint8_tNum[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//段码
constuint8_tAddr[8]={08h,0ah,0ch,0eh,00h,02h,04h,06h};//地址 WriteDATA(Addr[0],Num[Disp[0]]);//最左边的数码管显示第一位学号
(5) ACLK设置
初始化时,需要设置ACLK引脚输出,即 P1DIR|=BIT0; P1SEL|=BIT0; 1 06 2 5B 3 4F 4 66 5 6D 6 7D 7 07 8 7F 9 6F A 77 B 7C C 39 D 5E E 79 F 71 三、实验步骤
1.将PC与开发板相连; 2. 建立CCS工程; 3. 选择
对该工程进行编译链接,生成.out 文件。然后选择
全速运行程序,也可以选择
,将程序下载到实验板中。
单步调试程序,
程序下载完毕之后,可以选择
选择 F3 查看具体函数。也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。再按下实
验板的复位键,运行程序。
四、实验现象
按下按键1显示08012202,按下按键2显示08012208。
五、实验代码
#include
const uint8_t Disp1[8]={0,8,0,1,2,2,0,2}; const uint8_t Disp2[8]={0,8,0,1,2,2,0,8};
const uint8_t Num[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F, 0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//段码
const uint8_t Addr[8]={0x08,0X0a,0X0c,0X0e,0X00,0X02,0X04,0X06};//地址
//原始
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P3DIR |= BIT2+BIT4+BIT5; init_TM1638(); unsigned char i; while(1) { for(i = 0; i < 8; i++) { Write_DATA(Addr[i],Num[Disp1[i]]); } } }
//进阶
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P3DIR |= BIT2+BIT4+BIT5; init_TM1638();
Write_DATA(Addr[0],Num[Disp1[0]]); unsigned char i;
unsigned char stu=1; P4REN |= BIT2+BIT3; P4OUT |= BIT2+BIT3; while(1) { if((P4IN&BIT2)==0)//没有按下 stu=1; if((P4IN&BIT3)==0) stu=2; for(i=0;i<8;i++) { if(stu==1) { Write_DATA(Addr[i],Num[Disp1[i]]); } else if(stu==2) { Write_DATA(Addr[i],Num[Disp2[i]]); } //_delay_us(1); } } }
六、预习思考
掌握LED数码管的显示控制,并说明采用TM1638是如何实现段控和位控的。
答:通过管脚的电平高低来进行设置。其中,SEG9~SEG10为输出(段),控制段输出,P管开漏输出。 GRID1~GRID8为输出(位),控制位输出,N管开漏输出。
七、实验总结
本次实验了解了TM1638芯片工作原理与使用方法,和LED 数码管的动态显示控制。
实验程序能够顺利运行。
共分享92篇相关文档