让单片机的数码管显示的数从0开始递增一直到255,然后重新置0,再递增,如此循环.
还是用到了将要显示的数进行百位,十位,个位的分离.
从这篇开始,以后的程序就要注意程序的规范性,与可读性了.源代码如下(已经成功调通):
#include#define uint unsigned int #define uchar unsigned char sbit sda = P1^0; sbit clk = P1^1; sbit dig1 = P1^2; sbit dig2 = P1^3; sbit dig3 = P1^4; sbit dig4 = P1^ 5; uchar code table[]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde}; uchar times; void init(); void delay(uchar); void write(uchar); void display(uchar); void main() { uchar i = 0; init(); while(1) { display(i); if(times>2) { times = 0; i ++; if(i==256) i = 0; } } } /** 显示一个3位的整数 **/ void display(uchar num) { uchar bai,shi,ge; bai = num/100; shi = num%100/10; ge = num%10; /* 显示个位 */ dig4 = 0; write(table[ge]); delay(10); dig4 = 1; /* 显示十位 */ dig3 = 0; write(table[shi]); delay(10); dig3 = 1; /* 显示百位 */ dig2 = 0; write(table[bai]); delay(10); dig2 = 1; } /** 程序初始化函数 **/ void init() { clk = 0; times = 0; TMOD = 0x01; //定时器模式1 TH0 = (65536-50000)/256; //每500毫秒产生一次中断 TL0 = (65536-50000)%256; TR0 = 1; //开始计时 EA = 1; //打开总中断开关 ET0 = 1; } /** 向数据码管写入一个字节数据 **/ void write(uchar u) { uchar i; for(i=0;i<8;i++) { clk = 1; sda = u&0x80; clk = 0; u = u<<1; } } /** 延迟函数 **/ void delay(uchar t) { uchar x,y; for(x=t;x>0;x--) for(y=101;y>0;y--); } /** 1号中断 **/ void timer0() interrupt 1 { TH0 = (65536-50000)/256; //每500毫秒产生一次中断 TL0 = (65536-50000)%256; times ++; }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』