#include<reg51.h>
#define uchar unsigned char
//地址定义
#define adr_bit_1 0x01 //显示数据1的寄存器地址
#define adr_bit_2 0x02 //显示数据2的寄存器地址
#define adr_bit_3 0x03 //显示数据3的寄存器地址
#define adr_bit_4 0x04 //显示数据4的寄存器地址
#define adr_bitrans_mode 0x09 //译码方式寄存器的地址
#define adr_light_con 0x0a //亮度寄存器
#define adr_scan_count 0x0b //扫描界线寄存器
#define adr_close 0x0c //掉电控制寄存器
#define adr_glint_con 0x0d //闪烁控制寄存器
#define adr_show_test 0x0f //显示测试寄存器
//管脚定义
sbit jia=P1^0;
sbit jian=P1^1;
sbit max7219_pin_LOAD=P2^0;
sbit max7219_pin_CLK=P2^1;
sbit max7219_pin_DIN=P2^2;
sbit max7219_pin_RST=P2^3;
//函数声明
void shuchu(unsigned char B ); //显示输出和电压调节
void chaoshi_2s(); //超时2s判断子程序
void xd_delay();
void max7219_reset(); //复位
void max7219_init(); //初始化控制寄存器
void max7219_echo(unsigned char bw,sw,gw,dw); //数据寄存器
void max7219_send_data(unsigned char addr,da); //完成一次寄存器的写操作
void max7219_delay(void);
//uchar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
char timer=0;
uchar bw=0,sw=0,gw=5,dw=0;
uchar B;
//初始化
B=50;
P0=B;
max7219_reset(); //复位
max7219_init(); //初始化控制寄存器
max7219_echo(uchar bw,sw,gw,dw); //数据寄存器显示
max7219_send_data(uchar addr,da); //完成一次寄存器的写操作
chaxun: if(P1==0xff) //判断是是否有键按下
{
xd_delay();
goto chaxun;
}
else
{
if(jia==0) //判断是否按下+键
{
if(P0==0xff) //输出已为最大值
goto chaxun;
else //未达最大值
{
chaoshi_2s(); //返回一个 timer判断
if(timer==32) //是否超过按键超过2s
{
chang_jia: v++;
shuchujia_0.1v(char B);
if(P0==0xff) //输出已为最大值
goto chaxun;
else //未达最大值
{ if(jia==0) //判断是否按下+键
{ //xd_delay();
goto chang_jia;
}
else
goto chaxun;
}
}
else
{ v++;
shuchujia_0.1v(uchar B);
goto chaxun;
}
}
}
if(jian==0) //按下—键
{ if(P0==0) //输出已为最小值
goto chaxun;
else //已达最小值
{ chaoshi_2s(); //返回一个判断值timer
if(timer==32) //是否超过按键超过2s
{ chang_jian: v--;
shuchujian_0.1v(uchar B);
if(P0==0) //输出已为最小值
goto chaxun;
else //未达最小值
{ if(jian==0) //判断按下是-键
{ //xd_delay();
goto chang_jian;
}
else
goto chaxun;
}
}
else
{
v--;
shuchujian_0.1v(uchar B)
goto chaxun;
}
}
}
}
}
void shuchu(uchar B) //修改显示数值及电压输出
{ //输出电压改变
P0=B;
//显示改变
bw=B/1000;
sw=B%1000/100;
gw=B%1000%100/10+0x80;
dw=B%10;
/*bw=a[bw];sw=a[sw];gw=a[gw]+0x80; dw=a[dw];*/
max7219_echo(unsigned char bw,sw,gw,dw); //数据寄存器显示
max7219_send_data(unsigned char addr,da); //完成一次寄存器的写操作
}
void chaoshi_2s() //查询超2s子程序
{ TMOD=0x01;
TH0=0xff;
TL0=0xff;
TR0=1;
while(jia==0||jian==0)
{ while(!TF0); //定时一次未到空等待
timer++;
TH0=0xff; //重新装入数值
TL0=0xff;
if(timer==32)
break;
}
}
//延时消抖
void xd_delay()
{ uchar i;
for(i=0;i<2000;i++);
}
///完成max7219的复位
void max7219_reset()
{ uchar i
max7219_pin_RST=0;
for(i=0;i<125;i++)
max7219_delay();
max7219_pin_RST=1;
for(i=0;i<125;i++)
max7219_delay();
max7219_pin_RST=0;
for(i=0;i<125;i++)
max7219_delay();
}
//通过写控制寄存器,完成max7219的初始化
void max7219_init()
{ max7219_reset();
max7219_send_data(addr_scan_count,0x04);
max7219_send_data(addr_light_con,0x80);
max7219_send_data(addr_trans_mode,0xff);
max7219_send_data(addr_close,0x01);
}
//入口参数 bw,sw,gw,dw
//送8位显示数据到显示寄存器
void max7219_echo(unsigned char bw,sw,gw,dw)
{ max7219_send_data(addr_bit_1,bw);
max7219_send_data(addr_bit_2,sw);
max7219_send_data(addr_bit_3,gw);
max7219_send_data(addr_bit_4,dw);
}
//入口地址:addr寄存器地址,da寄存器设置值
//把设置值写入对应的寄存器中
void max7219_send_data(unsigned char addr,da)
{ uchar i,byte_out;
byte_out=adr;
mwx7219_pin_DIN=1;
mwx7219_pin_CLK=1;
mwx7219_pin_LOAD=0;
for(i=1;i<8;i++)
{ mwx7219_pin_CLK=1;
mwx7219_pin_DIN=(bit)(byte_out&0x80);
byte_out=byte_out<<1;
mwx7219_CLK=0;
max7219_delay();
}
mwx7219_pin_CLK=1;
byte_out=da;
for(i=0;i<7;i++)
{ mwx7219_pin_CLK=1;
mwx7219_pin_DIN=(bit)(byte_out&0x80)
byte_out=byte_out<<1;
mwx7219_CLK=0;
max7219_delay();
}
mwx7219_pin_CLK=1;
mwx7219_pin_LOAD=1;
mwx7219_pin_DIN=(bit)(byte_out&0x80);
mwx7219_pin_CLK=0;
max7219_delay();
max7219_pin_CLK=1;
}
//延时
void max7219_delay(void)
{ uchar i;
for(i=0;i<125;i++)
{
}
}
总是在第46行 max7219_echo(unsigned char bw,sw,gw,dw);附近显示语法错误,但是我又没检查出错误出处,求指点
|