{
unsigned int x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void main() {
wela=1; //打开位选 P0=0xc0; wela=0;
while(1) {
for(num=0;num<16;num++) {
dula=1;
P0=table[num]; dula=0;
delay(1000); } } }
简单的总结一下目前为止的心得:最大疑问就是,比如说:为什么P2或者是P2^6就能控制数码管或者发光二极管等等,这些疑问,其实可以通过仔细观察电路图的引脚就能够知道。以数码管的静态显示为例,通过P2^6=1,打开锁存器的使能端,接着为P0置数(这是为通过此锁存器选择数码管)。位选好了之后就是段选,同样的,通过P2^7=1,打开另一个锁存器的使能端,接着为P0置数(这是为通过此锁存器让数码管具体显示示数)。
中断
#include
unsigned char num;
unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
void delay(unsigned int z) {
unsigned int x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void main() {
num=0; tt=0;
EA=1; //开总中断 EX0=1; //开外部中断0 //IT0=1;
/*中断打开必须同时满足三个条件,中断源有中断请求;此中断源的中断允许位为1,cpu打开中断(EA=1)。*/
/*外部中断0有两种触发方式,电平触发(IT0=0)和边沿触发(IT0=1)(默认的情况为电平触发)*/
/*那么怎么知道在什么条件下触发了中断呢?例如此题,因为设置为外部中断0,所以,触发的条件是P3^2=0*/
wela=1; //打开位选 P0=0xc0; wela=0;
while(1) {
for(num=0;num<16;num++) {
dula=1;
P0=table[num]; dula=0;
delay(1000); } } }
void exter0() interrupt0 //中断服务程序,没有返回值 {
d1=0; }
注意:外部中断的触发方式的选择,如上例,触发方式选择的是电平触发方式,当触发中断时,P3^2=0.有发光二极管亮,但是此时主程序不走了; 若将IT0=1(边沿触发),则此时发光二极管一闪,然后主程序继续运行。
定时器/计数器中断
#include
unsigned char num,tt;
unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
void delay(unsigned int z) {
unsigned int x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void main() { num=0;
tt=0;
TMOD=0x01;//设置定时器0位工作方式1
TH0=(65536-50000)/256; //定时器0的计数器寄存器的高8位 TL0=(65536-50000)%6; //定时器0的计数器寄存器的低8位 /*定时50ms,且50ms一到,触发中断*/
}
void exter0() interrupt 1 //中断服务程序,没有返回值 {
TH0=(65536-50000)/256; TL0=(65536-50000)%6; tt++;
/*因为我们到定时1s,所以要中断20次*/ }
注意:这里我有一个疑问,定时器的触发是什么呢?
目前的答案貌似是这样的:当执行到语句if(tt==20),此时计算机必须要查询tt的值,用来判断。所以正是此时进入中断程序的。
EA=1; //开总中断
ET0=1; //开定时器中断 TR0=1; //启动定时器0
wela=1; //打开位选 P0=0xc0; wela=0; dula=1; P0=0x3f; dula=0;
while(1) {
if(tt==20) {
tt=0; num++;
dula=1;
P0=table[num]; dula=0;
//delay(1000); } }
发光二极管循环点亮,并且,利用定时器中断使数码管每隔
2s点亮
#include
unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
unsigned char temp;
void delay(unsigned int z) {
unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
void main() { num=0; aa=0; temp=0xfe; P1=temp; wela=1; P0=0xc0; wela=0; dula=1; P0=table[num]; TMOD=0x01;//设置定时器0位工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%6; /*定时50ms,且50ms一到,触发中断*/ EA=1; //开总中断 ET0=1; //开定时器中断