📄 欢迎光临停止营业1.c
字号:
// A B C D 对应P1.0; P1.1 ; P1.2; P1.3
//--------------------------------
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
//========================
//****滚屏事件定义****
#define MSG_MV_L 1 //左移
#define MSG_MV_R 2 //右移
#define MSG_MV_U 3 //上移
#define MSG_MV_D 4 //下移
#define MSG_NONE -1 //无
uchar MSG_MV = -1;
//========================
//****引脚定义****
sbit CLK =P2^5 ; //74HC595移时钟
sbit STB =P2^4 ; // 74HC595锁存信号
sbit Red=P2^7 ; //红色数据输出引脚低电平有效
sbit Greed=P2^6; //全屏控制使能0,低电平有效
sbit OE = P0^7; //全屏使能
//========================
uchar SendData; //要发送的数据变量
uchar hang; //行扫描变量 (半屏只有16行,所以hang=0到15)
uchar move_times = 0; //左右移动位数
uchar data h_dispram[10]; //显示缓存
uchar code *disword[26]; //显示文字指针
void Keyscan (void); //修改参数按键扫描子程序
void Sendping(); //发送半屏子程序
void Put_Wdispram(uchar first_word);
void Put_Hdispram(); //把显示文字放入显示缓存
void Move_Left(); //左移
void Move_Right(); //右移
void RL_Move();
void UD_Move();
void Show_Line();
void Show_Move_Word();
void delay();
void SendByte(void);
void RowsCan(void);
uchar code MY_WORDS[][16]=
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x10,0x08,0x04,0x7F,0x01,0x21,0x12,0x0A,0x04,0x06,0x0A,0x11,0x21,0x41,0x80,0x00},
{0x04,0x04,0x04,0xA4,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x04,0x84,0x14,0x08,0x00},/*"刘",0*/
{0x02,0x01,0x3F,0x20,0x40,0x00,0x00,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x05,0x02},
{0x00,0x04,0xFE,0x04,0x08,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"宁",1*/
{0x01,0x01,0x01,0x01,0x01,0x1F,0x10,0x10,0x10,0x1F,0x10,0x01,0x28,0x24,0x44,0x00},
{0x00,0x00,0xF8,0x00,0x10,0xF8,0x10,0x10,0x10,0xF0,0x10,0x10,0x88,0x44,0x44,0x00},/*"点",2*/
{0x00,0xF8,0x88,0x97,0xA1,0x91,0x8A,0x8F,0x88,0xA8,0x97,0x80,0x80,0x80,0x80,0x80},
{0x80,0x80,0x80,0xFC,0x00,0x40,0x40,0xFC,0x40,0x40,0xFE,0x40,0x40,0x40,0x40,0x40},/*"阵",3*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};
void Put_Wdispram(uchar first_word){
uchar i;
for(i=0;i<10;i++){
disword[i] = &MY_WORDS[first_word+i][0];
}
}
void Put_Hdispram(){
uchar i;
for(i=0;i<10;i++){
h_dispram[i] = *(disword[i]+hang); //
}
}
void Move_Left(){
uchar i;
for(i=0;i<9;i++){
h_dispram[i] = (h_dispram[i] << (move_times)) | (h_dispram[i+1] >> (8-move_times));
}
}
void Move_Right(){
uchar i;
for(i=9;i>0;i--){
h_dispram[i] = (h_dispram[i] >> (move_times)) | (h_dispram[i-1] << (8-move_times));
}
}
void RL_Move(){
//
switch(MSG_MV){
case MSG_MV_L: //左移
Move_Left();
break;
case MSG_MV_R: //右移
Move_Right();
break;
case MSG_NONE:
break;
default:
break;
}
}
void UD_Move(){
//
switch(MSG_MV){
case MSG_MV_U: //左移
// Move_Up();
break;
case MSG_MV_D: //右移
// Move_Down();
break;
case MSG_NONE:
break;
default:
break;
}
}
void Show_Line(){
uchar m;
OE=1;
for(m =0;m<8;m++)
{
SendData = h_dispram[m+1];
SendByte();
}
STB = 0;
STB = 1; //上升沿数据锁存
RowsCan(); //行扫描
OE = 0;
delay(); //
}
void Show_Move_Word(){
int m,i;
for(m=0;m<7;m++){ //若要上下移动 m=16
//hang = 0;
for(i=0;i<16;i++){
Put_Hdispram(); //把第i行放入行缓冲
RL_Move(); //是否要左右移动
Show_Line();
//delay(); //看需要
}
//UD_Move(); //是否要上下移动
}
//========================================
//测试左移右移
move_times++;
if((move_times == 9) && (MSG_MV == MSG_MV_L)){
move_times = 0;
MSG_MV = MSG_MV_R;
}
else if((move_times == 9) && (MSG_MV == MSG_MV_R)){
move_times = 0;
MSG_MV = MSG_MV_L;
}
}
void delay()
{
uint i;
for(i=0;i<40;i++);
}
//------------------------------------
//----------字发送子程序-----------
void SendByte(void)
{
uchar m;
for(m=0;m<8;m++)
{
CLK = 0;
Red = (SendData & 0x80); //红屏显示
// Greed = (SendData & 0x80); //绿屏显示
SendData =SendData<<1;
CLK = 1; //移位时钟上升沿
}
}
//-----------------------------------
//----------行扫描子程序-------------
void RowsCan(void)
{
P2 = P2 & 0xf0;
P2 = P2 | hang;
hang++;
if (hang>=16)
{
hang =0x00;
}
}
void initial(void)
{
OE = 1;
Red = 1;
Greed = 1;
SendData = 0x00;
hang = 0x00;
}
//;---------主程序循环--------------
void main()
{
initial();
MSG_MV = MSG_MV_L;
Put_Wdispram(0); //
while(1)
{
Show_Move_Word();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -