搜索
bottom↓
回复: 4

CH451驱动数码管 MEGA16

[复制链接]

出0入0汤圆

发表于 2009-8-13 11:15:02 | 显示全部楼层 |阅读模式
#include <ioM16v.h>
#include <macros.h>
#include "delayms.h"
/*------宏定义------*/
#define uchar unsigned char
#define uint unsigned int
#define ch451din   PORTB
   
#define ch451dclk0 PORTB&=~BIT(PB1)
#define ch451dclk1 PORTB|=BIT(PB1)
#define ch451load0 PORTB&=~BIT(PB2)
#define ch451load1 PORTB|=BIT(PB2)

#define ch451dout  PB3
//CH451复位
#define CH451_RESET 0x0201
//设置移动方式-作移、左循、右移、右循
#define CH451_LEFTMOV 0x0300
#define CH451_LEFTCYC 0x0301
#define CH451_RIGHTMOV 0x0302
#define CH451_RIGHTCYC 0x0303
//设置BCD译码方式
#define CH451_BCD 0x0580
//设置数码管闪烁控制
#define CH451_TWINKLE 0x0600
//数码管各位显示
#define CH451_DIG0 0x0800
#define CH451_DIG1 0x0900
#define CH451_DIG2 0x0a00
#define CH451_DIG3 0x0b00
#define CH451_DIG4 0x0c00
#define CH451_DIG5 0x0d00
#define CH451_DIG6 0x0e00
#define CH451_DIG7 0x0f00

//CH451初始化
void ch451_init()
{

ch451din=0;   //ch451din为PB0
ch451din=1;
}

//输出命令子程序
//定义一个无符号整型变量存储12字节的命令字
void ch451_write(uint command)
{
uchar i;
ch451load0;
for(i=0;i<12;i++)
{
ch451din=command&1;
ch451dclk0;
ch451dclk1;
command>>=1;
}
ch451load1;
}

//读取按键函数
uint ReadKey(void)
{
uchar i;
uint key=0;
uint command=0x700;
ch451load0;
for(i=0;i<12;i++)
{
ch451din=command&1;
ch451dclk0;
ch451dclk1;
command>>=1;
}
ch451load1;   

key=ch451dout;
for(i=0;i<6;i++)
{
ch451dclk0;
key<<=1;
key|=ch451dout;
ch451dclk1;  
}
return key;

}



//CH451端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x07;
DDRB = 0x07;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}



//单片机C语言主函数
void main(void)
{
uint key1;
port_init();
ch451_write(CH451_RESET);                         //复位

ch451_init();
ch451_write(0x403);                                         //关闭闪烁,关闭看门狗,打开键盘扫描 ,打开显示
ch451_write(0x500);                                         //不译码方式,扫描8个管,亮度默认值
ch451_write(0x600);                    //闪烁功能关闭
//ch451_write(CH451_DIG0|0xFF);         //不译码方式,显示8,无小数点
//ch451_write(CH451_DIG1|0xFF);
//ch451_write(CH451_DIG2|0xFF);
//ch451_write(CH451_DIG3|0xFF);
//ch451_write(CH451_DIG4|0xFF);
//ch451_write(CH451_DIG5|0xFF);
//ch451_write(CH451_DIG6|0xFF);
ch451_write(CH451_DIG7|0xFF);   
while(1)
{

if((PINB&0x08)==0)

key1=ReadKey();

switch(key1)
{
case 0x40:
{
ch451_write(0x0800); //在第0个数码管显示0
break;
}
case 0x41:
{
ch451_write(0x0906);//在第1个数码管显示1
break;
}
case 0x42:
{
ch451_write(0x0A5B);//在第2个数码管显示2
break;
}

case 0x43:
{
ch451_write(0x0B4F);//在第3个数码管显示3
break;
}
case 0x48:
{
ch451_write(0x0C66);//在第4个数码管显示4
break;
}
case 0x49:
{
ch451_write(0x0D6D);//在第5个数码管显示5
break;
}
case 0x4A:
{
ch451_write(0x0E7D);//在第6个数码管显示6
break;
}

case 0x4B:
{
ch451_write(0x0F07);//在第7个数码管显示7
break;
}

default:break;



}



}

}
这是我们的一个驱动程序,显示没有问题,但是读键值函数ReadKey()中总是返回0xff,此函数中key=ch451dout;指令后key为0x03,请教为什么会出现这种错误,谢谢,或者各位能否发个mega16的ch451驱动程序参考一下 谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-8-13 14:49:19 | 显示全部楼层
key|=ch451dout;
可是
#define ch451dout  PB3
但是头文件<ioM16v.h>里PB3应该是个常数3,读取引脚输入应该是PINx寄存器.
所以建议改为:
if(PINB&(1<<PB3))
    key|=1;

或者:
key|=(PINB&(1<<PB3))>>PB3;

出0入0汤圆

发表于 2009-10-31 14:18:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-17 20:55:17 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-11-30 15:42:55 | 显示全部楼层
MARK   我也准备用这个做一个数码管显示和按键扫描的电路板,现在正在看CH451的资料,说实话看资料看得还真头疼,老是看不下去
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 04:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表