小白求助啦 哪位大神帮个忙呗帮我看看
proteus吧
全部回复
仅看楼主
level 1
南理谢套 楼主
编译的时候没有问题但是仿真的时候就会报错
#include<reg52.h> //包含头文件,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
unsigned char code
smg_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //定义共阴极数码管段0-F
uchar keyscan (void);//键盘扫描函数的声明
void delay(void); //声明延时函数
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
sbit BEEP=P2^3; //喇叭输出脚
uchar th0_f; //在中断中装载的 T0 的值高 8 位
uchar tl0_f; //在中断中装载的 T0 的值低 8 位
void delay(void) //定义延时函数
{
unsigned i,j;
for(i=0;i<20;i--)
for(j=0;j<250;j++);
}
uchar keyscan (void)//键盘扫描函数
{
uchar key_h;//行值中间变量
uchar key_l;//列值中间变量
P1=0x0f;//行线输出全为零
key_h=P1&0x0f;//读取行线的值
if(key_h!=0x0f)//检测有无按键按下
{
delay();//去除抖动
if(key_h!=0x0f)
{
key_h=P1&0x0f;//读入行线的值
P1=key_h|0xf0;//输出当前行线的值
key_l=P1&0xf0;//读入列线的值
return(key_h+key_l);//行线值与列线值相加输出组合码的值
}
}
return(0x00);//返回该值
}
uchar code freq[36*2]={
0xA9,0xEF,//00220HZ ,1 //0
0x93,0xF0,//00233HZ ,1#
0x73,0xF1,//00247HZ ,2
0x49,0xF2,//00262HZ ,2#
0x07,0xF3,//00277HZ ,3
0xC8,0xF3,//00294HZ ,4
0x73,0xF4,//00311HZ ,4#
0x1E,0xF5,//00330HZ ,5
0xB6,0xF5,//00349HZ ,5#
0x4C,0xF6,//00370HZ ,6
0xD7,0xF6,//00392HZ ,6#
0x5A,0xF7,//00415HZ ,7
0xD8,0xF7,//00440HZ 1 //12
0x4D,0xF8,//00466HZ 1# //13
0xBD,0xF8,//00494HZ 2 //14
0x24,0xF9,//00523HZ 2# //15
0x87,0xF9,//00554HZ 3 //16
0xE4,0xF9,//00587HZ 4 //17
0x3D,0xFA,//00622HZ 4# //18
0x90,0xFA,//00659HZ 5 //19
0xDE,0xFA,//00698HZ 5# //20
0x29,0xFB,//00740HZ 6 //21
0x6F,0xFB,//00784HZ 6# //22
0xB1,0xFB,//00831HZ 7 //23
0xEF,0xFB,//00880HZ `1
0x2A,0xFC,//00932HZ `1#
0x62,0xFC,//00988HZ `2
0x95,0xFC,//01046HZ `2#
0xC7,0xFC,//01109HZ `3
0xF6,0xFC,//01175HZ `4
0x22,0xFD,//01244HZ `4#
0x4B,0xFD,//01318HZ `5
0x73,0xFD,//01397HZ `5#
0x98,0xFD,//01480HZ `6
0xBB,0xFD,//01568HZ `6#
0xDC,0xFD,//01661HZ `7 //35
};
timer0() interrupt 1
{
TL0=tl0_f;TH0=th0_f; //调入预定时值
BEEP=~BEEP; //取反音乐输出 IO
}
void main()//定义主函数
{
uchar key,ukey ;
uint n;
uchar code jie8[]={12,14,16,17,19,21,23,24};//1234567`1 八个音符在频率表中的位置
P0=0x00;//设置数码管的电平,显示按键上的按键码
TMOD = 0x01; //使用定时器 0 的 16 位工作模式
TR0 = 0;
ET0 = 1;
EA = 1;
while(1)
{
key=keyscan ();//调用键盘扫描
ukey=~key;
switch(ukey)
{
case 0x11:P0=smg_d[0];
tl0_f=freq[jie8[0]*2]; //置一个音符的值
th0_f=freq[jie8[0]*2+1];
TR0 = 1;
for(n=0;n<10000;n++); break;//显示按键码“0”
case 0x21:P0=smg_d[1];
tl0_f=freq[jie8[1]*2]; //置一个音符的值
th0_f=freq[jie8[1]*2+1];
TR0 = 1;
for(n=0;n<10000;n++); break;//显示按键码“1”
case 0x41:P0=smg_d[2];
tl0_f=freq[jie8[2]*2]; //置一个音符的值
th0_f=freq[jie8[2]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“2”
case 0x81:P0=smg_d[3];
tl0_f=freq[jie8[3]*2]; //置一个音符的值
th0_f=freq[jie8[3]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“3”
case 0x12:P0=smg_d[4];
tl0_f=freq[jie8[4]*2]; //置一个音符的值
th0_f=freq[jie8[4]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“4”
case 0x22:P0=smg_d[5];
tl0_f=freq[jie8[5]*2]; //置一个音符的值
th0_f=freq[jie8[5]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“5”
case 0x42:P0=smg_d[6];
tl0_f=freq[jie8[6]*2]; //置一个音符的值
th0_f=freq[jie8[6]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“6”
case 0x82:P0=smg_d[7];
tl0_f=freq[jie8[7]*2]; //置一个音符的值
th0_f=freq[jie8[7]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“7”
case 0x14:P0=smg_d[8];
tl0_f=freq[jie8[8]*2]; //置一个音符的值
th0_f=freq[jie8[8]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“8”
case 0x24:P0=smg_d[9];
tl0_f=freq[jie8[9]*2]; //置一个音符的值
th0_f=freq[jie8[9]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“9”
case 0x44:P0=smg_d[10];
tl0_f=freq[jie8[10]*2]; //置一个音符的值
th0_f=freq[jie8[10]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“a”
case 0x84:P0=smg_d[11];
tl0_f=freq[jie8[11]*2]; //置一个音符的值
th0_f=freq[jie8[11]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“b”
case 0x18:P0=smg_d[12];
tl0_f=freq[jie8[12]*2]; //置一个音符的值
th0_f=freq[jie8[12]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“c”
case 0x28:P0=smg_d[13];
tl0_f=freq[jie8[13]*2]; //置一个音符的值
th0_f=freq[jie8[13]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“d”
case 0x48:P0=smg_d[14];
tl0_f=freq[jie8[14]*2]; //置一个音符的值
th0_f=freq[jie8[14]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“e”
case 0x88:P0=smg_d[15];
tl0_f=freq[jie8[15]*2]; //置一个音符的值
th0_f=freq[jie8[15]*2+1];
TR0 = 1;
for(n=0;n<10000;n++);break;//显示按键码“f”
}
}
}
2018年04月09日 12点04分 1
1