求一个好的ch451控制程序。我在网上找了几个不太好用的。求高手使用,给20分!
有三种方法可以写出你想展示的东西。
//LED _ printf(uchar * LED _ Data);//被添加数据的字符串地址,例如:ucharled [8] = {7,6,5,4,3,2,1,0 };
LED_printc(uchar p,uchar LED _ data);//对于单个数据显示,第一位是位置,第二位是数值,例如:LED_printc(2,3);
LED_prints(无符号char * LED _ string);//直接显示字符串地址。
最简单的LED _ prints(" 1234567 ");
而下面最重要的pin需要更换。
怎么换连接?
*/
#ifndef __CH451_H__
#define __CH451_H__
/*
//LED _ printf(uchar * LED _ Data);//添加数据的字符串地址,例如:ucharled [8] = {7,6,5,4,3,2,1,0 };
LED_printc(uchar p,uchar LED _ data);//对于单个数据显示,第一位是位置,第二位是数值,例如:LED_printc(2,3);
LED_prints(无符号char * LED _ string);//直接显示字符串地址,例如:LED _ prints(" 123456 ");
*/
/************************************************************/
# include & ltreg52.h & gt
#定义uint无符号整数
#定义uchar无符号字符
#定义CH451 _ dig 00x 0800//定义ch 451的输出引脚。
#定义CH451_DIG1 0x0900
#定义CH451_DIG2 000
#定义CH451_DIG3 0x0b00
#定义CH451_DIG4 0x0c00
#define CH451_DIG5 0x0d00
#define CH451_DIG6 0x0e00
#define CH451_DIG7 0x0f00
sbit dout=p1^4;//串行接口数据输出
sbit load=p1^5;//串行数据加载
sbit din//串行数据输入
sbit dclk=p1^7;//串行数据时钟线
uchar key=1,key old = 2;
/* * * * * * * * * * * * * * * * * * * * m2t 1板的BCD转换* * * * * * * * * * * *
文件名:无符号字符BCD[]
功能:因为SEG0~7不对应a~dp,所以编程驱动转换。
入口参数:无
导出参数:无
************************************************************/
无符号字符码BCD[]={0x77,0x21,0x5d,0x6d,//0,1,2,3,
0x2b,0x6e,0x7e,0x25,//4,5,6,7,
0x7f,0x6f,0x3f,0x7a,//8,9,a,b,
0x58,0x79,0x5e,0x1e,//c,d,e,f,
0x00,0xda,0x24,0x BC };//0x10无显示,0x11度,0x12双点,0x13 _ n。
/* * * * * * * * * * * * * * * * * * * *发送指令至CH451 * * * * * * * * * * * * * * * *
名称:Voidch451 _ write (uintdat,uintlength)
功能:发送指令到CH451。
Entry参数:uint dat需要发送的指令。
uint长度发送指令(dat)的长度。
导出参数:无
************************************************************/
void CH451_Write(无符号dat) //uint长度
{
uint I;
荷载= 1;//串行数据加载端子设置为1。
for(I = 12;我& gt0;我-)
{
DCLK = 0;//串行数据时钟线设置为0。
if((dat & amp;0x 001)= = 0x 001)//确定数据的最低位是否为1。
DIN = 1;//如果数据的最低位是1,则将1写入din(串行数据输入)。
否则DIN = 0;//如果数据的最低位为0,则将0写入din(串行数据输入)。
DCLK = 1;//将串行数据时钟线设置为1。
dat = dat & gt& gt1;//数据向右移动一位。
}
负载= 0;//串行数据加载端子设置为1。
荷载= 1;//给load一个上升沿,将所有数据导入CH451。
}
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
名称:void led _ display(led _ data 1,led _ data2,led _ data3,led _ data4,
LED_Data5、LED_Data6、LED_Data7、LED_Data8)
功能:数字显示水平位置转换
入口参数:led _ data1,led _ data2,led _ data3,led _ data4,led _ data5,
led _ data6、led _ data7和led _ data8显示的代码。
导出参数:无
************************************************************/
void LED_printf(uchar *LED_Data)
{
ch 451 _ Write(ch 451 _ dig 0 | BCD[LED _ Data[7]]);//第8位显示,LED_Data8位想显示什么。
ch 451 _ Write(ch 451 _ dig 1 | BCD[LED _ Data[6]]);//第7位数字显示
ch 451 _ Write(ch 451 _ dig 2 | BCD[LED _ Data[5]]);//第6位数字显示
ch 451 _ Write(ch 451 _ dig 3 | BCD[LED _ Data[4]]);//第5位数字显示
ch 451 _ Write(ch 451 _ dig 4 | BCD[LED _ Data[3]]);//第四位数字显示
ch 451 _ Write(ch 451 _ dig 5 | BCD[LED _ Data[2]]);//第三位数字显示
ch 451 _ Write(ch 451 _ dig 6 | BCD[LED _ Data[1]);//第二个显示器
ch 451 _ Write(ch 451 _ dig 7 | BCD[LED _ Data[0]]);//1位显示
}
void LED_printc(uchar p,uchar LED_data)
{开关(p){
情况8:ch 451 _ Write(ch 451 _ dig 0 | BCD[LED _ data]);打破;//第8位显示,LED_Data8位想显示什么。
情况7:ch 451 _ Write(ch 451 _ dig 1 | BCD[LED _ data]);打破;//第7位数字显示
情况6:ch 451 _ Write(ch 451 _ dig 2 | BCD[LED _ data]);打破;//第6位数字显示
情况5:ch 451 _ Write(ch 451 _ dig 3 | BCD[LED _ data]);打破;//第5位数字显示
情况四:ch 451 _ Write(ch 451 _ dig 4 | BCD[LED _ data]);打破;//第四位数字显示
情况三:ch 451 _ Write(ch 451 _ dig 5 | BCD[LED _ data]);打破;//第三位数字显示
情况二:ch 451 _ Write(ch 451 _ dig 6 | BCD[LED _ data]);打破;//第二个显示器
案例1:ch 451 _ Write(ch 451 _ dig 7 | BCD[LED _ data]);打破;//1位显示
}
}
void LED_prints(无符号字符*led_string)
{
无符号字符I = 0;
while(led_string[i]!=0x00)
{ if(led _ string[I]& gt;= ' 0 ' & amp& ampled _ string[I]& lt;='9')
LED_printc(i+1,LED _ string[I]-0x 30);
else if(led _ string[I]& gt;= ' a ' & amp& ampled _ string[I]& lt;='z ')
LED_printc(i+1,LED _ string[I]-' a '+10);
i++;
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
文件名:void KeyStart()
功能:发送0111到DIN。
入口参数:无
导出参数:无
************************************************************/
void KeyStart()
{ uint i,dat = 0x07
荷载= 1;//串行数据加载端子设置为1。
for(I = 4;我& gt0;我-)
{
DCLK = 0;//串行数据时钟线设置为0。
if((dat & amp;0x 001)= = 0x 001)//确定数据的最低位是否为1。
DIN = 1;//如果数据的最低位是1,则将1写入din(串行数据输入)。
否则DIN = 0;//如果数据的最低位为0,则将0写入din(串行数据输入)。
DCLK = 1;//将串行数据时钟线设置为1。
dat = dat & gt& gt1;//数据向右移动一位。
}
负载= 0;//串行数据加载端子设置为1。
荷载= 1;//给load一个上升沿,将所有数据导入CH451。
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
文件名:CH451_ReadChange()
功能:将输入的7位转换成数字。
入口参数:无
导出参数:无
************************************************************/
CH451_ReadChange(uint dat)
{ uint a;
开关(dat)
{
案例0x7f:a = 0;打破;//0键按键。
案例0x7e:a = 1;打破;//1按键。
案例0x7d:a = 2;打破;//2按键。
案例0x7c:a = 3;打破;//3按键。
案例0x7b:a = 4;打破;//4按键。
案例0x7a:a = 5;打破;//5按键。
案例0x 79:a = 6;打破;//6按键。
案例0x 78:a = 7;打破;//7按键。
/*
案例0x3f:a = 10;打破;//0键释放键
案例0x3e:a = 11;打破;//1键释放键
案例0x3d:a = 12;打破;//2键释放键
案例0x3c:a = 13;打破;//3键释放键
案例0x3b:a = 14;打破;//4键释放键
案例0x3a:a = 15;打破;//5键释放键
案例0x 39:a = 16;打破;//6键释放键
案例0x 38:a = 17;打破;//7键释放键
*/
默认:a = 8;打破;
}
返回a;
}
/* * * * * * * * * * * * * * * * * * ch 451 _ read()* * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
文件名:CH451_Read()
功能:传输输入的7位数字。
条目参数:键
导出参数:键值00~07 10~17。
************************************************************************/
CH451_scan()
{ uint i,dat = 0;
key start();
for(I = 7;我& gt0;我-)
{ DCLK = 1;
if(DOUT==1)
dat = dat | 0x 01;
DCLK = 0;
dat = dat & lt& lt1;
}
dat = dat & gt& gt1;
DOUT = 1;
dat = ch 451 _ read change(dat);
key = dat
如果(关键!=8)
keyold = key
返回dat
}
/* * * * * * * * * * * * * * * * ch 451初始化* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
名称:void CH451_Init()
功能:CH451初始化,设置CH451选择4线串行接口。
入口参数:无
导出参数:无
************************************************************/
void CH451_Init()
{
DIN = 0;//为DIN设置高电平,CH451,选择4线串行接口。
DIN = 1;
DCLK = 1;//设置为默认高电平。
荷载= 1;
DOUT = 1;//设置为输入
ch 451 _ Write(0x 403);//设置系统参数并启用数字显示。
ch 451 _ Write(0x 508);//最后一位是亮度级别。
}
#endif