我的理解是楼主可能只用单片机和点阵模块来实现,这需要单片现来做动态扫描。
首先需要你把点阵上要显示图形的代码写出来,即每种图形每行显示的数据,每个图形有8行数据,即占8个字节的空间!
如果楼主用51单片机来实现的话,可以使用P0口输出行数据,P1口作为点阵的行扫描控制。
其次要用按键控制,只需你把每种图形以不同的表存起来,再做一个按键扫描程序,当检测到有键按下时,把动态扫描的表头地址更换即可!
楼主的那个程序我看不太懂:不过根据你的大概意思更改了一下程序,希望对你有帮助!下面是我的程序代码:
/********************************************************************
* 文件名 : 矩阵键盘.c
* 描述 : 该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示
当前的按键值。
*********************************************************************/
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71} //用于数码管显示 本程序未用
uchar Key //读出的键值
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j
for(j=0j<ij++)
for(x=0x<=148x++)
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
int i,j
for(i=0 i<=10 i++)
for(j=0 j<=2 j++)
}
/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}
for(j=0 j<4 j++)
{
P1 = Buffer[j]
temp = 0x01
for(i=0 i<4 i++)
{
if(!(P1 & temp))
{
return (i+j*4) //这里返回的是按键牌排列值!
}
temp <<= 1
}
}
}
/********************************************************************
* 名称 : InitTimer0()
* 功能 : 用于定时器初始化。
* 输入 : 无
* 输出 :
***********************************************************************/
unsigned int Timer_1s=0//定时器中断响应次数变量
//定时时间长度=定时中断响应时间*定时中断响应次数
void InitTimer0()
{
// AUXR=0x80 //定时时钟为Sysclk,即晶振时钟 实用于具有单时钟周期的单片机系列
//特别的还需要注意时钟设置在其它模块中的设置,如波特率的定时器1时钟设置
TMOD = 0x21 //定时器0工作于方式1,,16位定时,定时器1为波特率发生器
//特别地,高四位控制定时器1,低四位控制定时器0,
//所以此处需要注意程序中是否并存定时器1工作,如串口就需要定时1的设置为TMOD=0x20
TH0 = 0x0B8 //定时装如初值 //定时1000us 即1ms
TL0 = 0x00 //定时其它值可由需要重新计算初值
ET0 = 1 //允许中断
TR0 = 1 //启动定时器
}
/********************************************************************
* 名称 : Timer0Interrupt()interrupt 1
* 功能 : 定时器中断。
* 输入 : 无
* 输出 :
***********************************************************************/
void Timer0Interrupt() interrupt 1
{
TR0 = 0 //关闭定时器
TH0 = 0x0B8 //重装初值
TL0 = 0x00
Timer_1s++ //中断响应次数自加1
if(Timer_1s=20) //可以在此处调节按键的扫描时间
{
/*一下是扫描按键并带返回值的结果*/
P1 = 0xf0
if(P1 != 0xf0)
{
Delay_1ms(15) //按键消抖
if(P1 != 0xf0)
{
Key = Keyscan()
}
}
}
TR0 = 1 //启动定时器
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
InitTimer0()//初始化定时器
EA =1 //开中断
while(1)
{
switch (Key) //判断键值(那一个键按下)
{
case 0: /*加入需要执行该按键下的程序*/ break //假设0号按键被按下
case 1: /*加入需要执行该按键下的程序*/ break
case 2: /*加入需要执行该按键下的程序*/ break
case 3: /*加入需要执行该按键下的程序*/ break
case 4: /*加入需要执行该按键下的程序*/ break
case 5: /*加入需要执行该按键下的程序*/ break
case 6: /*加入需要执行该按键下的程序*/ break
case 7: /*加入需要执行该按键下的程序*/ break
case 8: /*加入需要执行该按键下的程序*/ break
case 9: /*加入需要执行该按键下的程序*/ break
case 10: /*加入需要执行该按键下的程序*/ break
case 11: /*加入需要执行该按键下的程序*/ break
case 12: /*加入需要执行该按键下的程序*/ break
case 13: /*加入需要执行该按键下的程序*/ break
case 14: /*加入需要执行该按键下的程序*/ break
case 15: /*加入需要执行该按键下的程序*/ break
default: break
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)