#include<reg51.h>
#include<absacc.h>
#define PD XBYTE[0xb003] //8255控制口
#define PC XBYTE[0xb002] //8255扩展C口
#define PB XBYTE[0xb001] //8255扩展B口
#define PA XBYTE[0Xb000] //8255扩展A口
#define DAC0832 XBYTE[0xC000] //DAC0832地址
unsigned char smgd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段吗
unsigned char smgb[]={0x00,0x01,0x02,0x03,0x04,0x05}; //数码管位码
unsigned char sc,sb,sa; //数码管个位c,十位b,百位a
unsigned char x=0;
void delay(unsigned int ms){ //可变延时
while(ms--);
}
void up(void){ //加一
EA=0;
if (x>254) x=255 ; else x++;
EA=1;
}
void down(void){ //减一
EA=0;
if (x<1) x=0 ; else x--;
EA=1;
}
void fangbo(void){
for(;;){
DAC0832=200;
delay(1);
DAC0832=0;
delay(1);
}
}
void juchibo(void){
unsigned char i;
while(1){
for (i=1;i<255;i++){
DAC0832=i;
}
}
}
void ADC0809start(void){
XBYTE[0xd000]=0x00; //通道0启动信号
x=XBYTE[0xd000];
XBYTE[0xd000]=0x00;
}
void ADC0809() interrupt 0{
x=XBYTE[0xd000];
XBYTE[0xd000]=0x00;
}
unsigned char keyscan(void){
unsigned char key;
while(1)
{
if (PB!=0xff){
delay(2900);
if (PB!=0xff){
key=PB;
switch(key){
case 0xfe : return 0x01 ;break;
case 0xfd : return 0x02 ;break;
case 0xfb : return 0x03 ;break;
case 0xf7 : return 0x04 ;break;
case 0xef : return 0x05 ;break;
case 0xdf : return 0x06 ;break;
case 0xbf : return 0x07 ;break;
case 0x7f : return 0x08 ;break;
default : return 0xff;
}
}
}
return 0xff;
}
}
void disp(void) interrupt 1{ //数码管显示中断服务子函数
TH0=0xC4; //定时器0初值装载
TL0=0x00; //定时器0初值装载
PA=smgd[sa];
PD=smgb[0];
delay(600);
PD=smgb[1];
PA=smgd[sb];
PD=smgb[2];
delay(600);
PD=smgb[3];
PA=smgd[sc];
PD=smgb[4];
delay(600);
PD=smgb[5];
}
void c8255init(void){ //8255初始化
PD=0x82;
PC=0xff;
PB=0xff;
PA=0Xff;
}
void main(void){ //主函数
c8255init();
TMOD=0x01; //设置定时器0工作在方式1
TH0=0xC4; //定时器0初值装载
TL0=0x00; //定时器0初值装载
EA=1; //开CPU中断
ET0=1; // 开定时器0中断
EX0=1; // 关外部中断
TR0=1; //启动定时/计数器0
IT0=1;
while(1){
sc=x%10;
sb=x%100/10;
sa=x/100;
DAC0832=x;
switch (keyscan()){
case 0x01: up();break; // 加1
case 0x02: down();break; // 减1
case 0x03: fangbo();break; // 输出方波
case 0x04: juchibo();break; //输出锯齿波
case 0x05: ADC0809start();break; //开启AD转换
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>