TA的每日心情 | 开心 2015-12-1 09:28 |
---|
签到天数: 90 天 连续签到: 1 天 [LV.6]常住居民II
|
本帖最后由 ??? 于 2013-3-19 00:38 编辑
以后再也不做摇摇棒了.把程序贴出来分享一下....
这种摇摇棒采用STC15管脚小单片机,最大可能的减少外部器件,(连晶振都省去了);io只用了8个;低功耗....
原理:和矩阵键盘一样;
特点:io用的少,电路简单,稳定,
图片只是一个接线示意图,具体什么可能有出入,我也不记得是哪个了.此外水银开关接中断上..
/*************************************
*文件:摇摇棒.c
*备注:调用delay文件
*版本:
*************************************/
#include <STC12C52.H>
#include"delay.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned char uint8;
typedef unsigned int uint16;
#define COM P1 //移植时修改此端口
#define H(x) ((~x)&0xf0) //高四位变化
#define L(x) (~x<<4) //低四位变化
#define BIT(X) (1<<(X))
#define time1 60 //扫描换时间
#define time2 0 //消隐时间
#define time3 500 //汉字之间间隔时长
#define string_num 9 //字符个数:注意空格哦
#define character_num 6 //汉字的个数
uchar KEY=0; //定义全局变量
void Write_Character(uint8 table[][32],uint8 num);
void Write_String();
code uint8 table[][32]=
{
///此处删了......
};
code uint8 table2[][32]=
{
/*-- 文字: 新 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x02,0x22,0x2A,0xA6,0x63,0x26,0x2A,0x22,0x00,0x3F,0x22,0x22,0x23,0x42,0x02,0x00,
0x04,0x48,0x52,0x41,0xFE,0x40,0x50,0x49,0x06,0xF8,0x00,0x00,0xFF,0x00,0x00,0x00,
/*-- 文字: 年 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x04,0x18,0xE3,0x22,0x22,0x22,0x22,0x3F,0x22,0x22,0x22,0x22,0x20,0x00,0x00,
0x20,0x20,0x20,0xE0,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
/*-- 文字: 快 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x07,0x00,0xFF,0x08,0x04,0x10,0x10,0x10,0xFF,0x10,0x10,0x1F,0x00,0x00,0x00,
0x80,0x00,0x00,0xFF,0x00,0x81,0x82,0x8C,0xB0,0xC0,0xB0,0x8C,0x82,0x81,0x81,0x00,
/*-- 文字: 乐 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x07,0x39,0x21,0x21,0x21,0x2F,0x41,0x41,0xC1,0x41,0x01,0x01,0x00,0x00,
0x00,0x04,0x08,0x10,0x60,0x02,0x01,0xFE,0x00,0x00,0x40,0x20,0x10,0x0C,0x00,0x00,
};
//code uchar logo1[][16]=
//{
//
//
///*-- 文字: I --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x00,0x10,0x10,0x1F,0x10,0x10,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,
//
///*-- 文字: --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
///*-- 文字: C --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x03,0x0C,0x10,0x10,0x10,0x10,0x1C,0x00,0xE0,0x18,0x04,0x04,0x04,0x08,0x10,0x00,
//
///*-- 文字: A --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x00,0x00,0x03,0x1C,0x07,0x00,0x00,0x00,0x04,0x3C,0xC4,0x40,0x40,0xE4,0x1C,0x04,
//
///*-- 文字: N --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x10,0x1F,0x0C,0x03,0x00,0x10,0x1F,0x10,0x04,0xFC,0x04,0x00,0xE0,0x18,0xFC,0x00,
//
///*-- 文字: --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//
///*-- 文字: F --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x10,0x1F,0x11,0x11,0x17,0x10,0x08,0x00,0x04,0xFC,0x04,0x00,0xC0,0x00,0x00,0x00,
//
///*-- 文字: I --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x00,0x10,0x10,0x1F,0x10,0x10,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,
//
///*-- 文字: Y --*/
///*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
//0x10,0x1C,0x13,0x00,0x13,0x1C,0x10,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00,0x00,
//
//
//
//};
/**********************************************************
函数名: void write_H(uchar dat_h)
参 数: uchar dat_h为要显示的高字节数据
返回值: 无
备 注: 显示摇摇棒的高字节
/***********************************************************/
void Write_H(uchar dat_h)
{
COM=H(dat_h)|BIT(1);
delay(time1);
COM=0XF0;
delay(time2);
COM=L(dat_h)|BIT(0);
delay(time1);
COM=0XF0;
delay(time2);
}
/**********************************************************
函数名: void Write_L(uchar dat_l)
参 数: uchar dat_l为要显示的低字节数据
返回值: 无
备 注: 显示摇摇棒的低字节
/***********************************************************/
void Write_L(uchar dat_l)
{
COM=H(dat_l)|BIT(3);
delay(time1);
COM=0xf0;
delay(time2);
COM=L(dat_l)|BIT(2);
delay(time1);
COM=0xf0;
delay(time2);
}
/****************外部中断0中断函数************************
函数名: void init_int0()
参 数: 无
返回值: 无
备 注: 初始化外部中断0
/***********************************************************/
void Init_INT0()
{
IT0=1;//设置下降沿触发中断
EX0=1;//使能外部中断0
EA=1;
}
/****************外部中断0中断函数************************
函数名: void INT_0() interrupt X0_INTNO
参 数: 调用全局变量 KEY
返回值: 无
备 注: 外部中断函数
***********************************************************/
void INT_0() interrupt X0_INTNO
{
EX0=0;
delay(200);
switch(KEY%4)
{
case 0: Write_Character(table,sizeof(table)>>5); break;
case 1: delay(50); break;
case 2: Write_Character(table2,sizeof(table2)>>5); break;
case 3: delay(50); break;
}
EX0=1;
KEY++;
if(KEY>200)
{
KEY=0;
}
}
/****************外部中断0中断函数************************
函数名: void write_string()
参 数: logo为存放字符串的二维数组 string_num 为字符的个数
返回值: 无
备 注: 显示字符串:注意一下,如果用取模软件空格也要算哦
/***********************************************************/
/*void Write_String()
{
uchar i,j;
for(j=0;j<string_num;j++)
{
for(i=8;i>0;i--)
{
Write_L(logo1[j][8-i]);
Write_H(logo1[j][16-i]);
}
delay(time3);
}
}
*/
/***************************************
函数名: void write_character(uint8 table[][32],uint8 num)
参 数: uint8 table[][32]为存放汉字的二维数组 num 为字符的个数
返回值: 无
备 注: 显示字符串:注意一下,如果用取模软件空格也要算哦
/***********************************************************/
void Write_Character(uint8 table[][32],uint8 num)
{
uint8 dat_L,dat_H;
uint8 i,j;
for(j=0;j<num;j++)
{
for(i=0;i<16;i++)
{
dat_L=table[j];
dat_H=table[j][i+16];
Write_L(dat_L);
Write_H(dat_H);
}
delay(time3);
}
}
int main()
{
P1M0=0X00;
P1M1=0X0F;
// PxM0 PxM1 移植时修改此端口
// 0 0 准双向口
// 0 1 强推挽输出
// 1 0 高阻输入态
// 1 1 开漏输出
EA=1;
Init_INT0();
while(1)
{
PCON=BIT(1); // 进入掉电模式 典型功耗小于2uA
}
return 0;
}
|
-
|