单片机led点阵的程序怎么写我想修改。用C语言写的、就是怎么样随机选择一组代码。让每次显示的内容都不

单片机led点阵的程序怎么写我想修改。用C语言写的、就是怎么样随机选择一组代码。让每次显示的内容都不,第1张

单片机我懂的不多,就跟不懂一样。。。。 但就软件编程这个角度我到可以提出我的想法

你不说有71个字是固定的,最后一个字从甲、乙、丙、丁里面随机选吗

那你在定义好了前71个字的数组后,可以定义一个二维数组,这二维数组里存放甲、乙、丙、丁

就像这样:

code unsigned char rndword[4][32]={{},{},{},{}};

我写点的地方你就写那些十六进制数字,这分别代表四个字

然后呢

你可能是先用一个循环把前71个字输出吧? 这我不管啥样。

反正到第72个字时,你要单独立出来来输出这个了随机数。

代码

int iRandom;

srand((unsigned)time(NULL)); // 这步是拿时间做随机数的种子

iRandom = rand()%4; //产生0到3的数,这个用来做二维数组的下标

然后你可能就用循环来输出了吧

for(j = 0 ; j < 32 ; j++)

{

//输出 rndword[iRandom][j]; 这看你单片机的咯

}

主要还是说下rand函数吧, 这要求你先拿一个东西做种子,一般都拿时间,就是srand是种子生成器,这样rand便能以时间做种子产生随机数了,之所以rand%4就是让它所产生的随机数除4取余,来得到0,1,2,3 来做数组下标用。 就这样

对了,忘了提醒,要加载

#include<stdlibh>

#include<timeh>

第一个头文件是srand 和rand函数的声明, 第二个是time函数的声明

#include <reg52h>

#define uchar unsigned char

#define uint unsigned int

#define outdat P2

sbit ld=P3^0;

sbit lw=P3^1;

//数码管显示代码

unsigned char code tab[]={

0x01,0x02,0x03,0x04,0xFF,0xFF,0xFF,0xFF};

void delay1ms(unsigned int count)  //延时1ms

{

unsigned char j;

for(;count>0;count--)

for(j=0;j<120;j++);

}

void display(unsigned char num)

{

outdat=tab[num];

ld=0;ld=1;ld=0;

outdat=0x01<<num;

lw=0;lw=1;lw=0;

delay1ms(2);

}

void main()

{

unsigned char i;

while(1)

{

for(i=0;i<8;i++)

{

display(i);

}

}

}

算法其实很简单,在不同时间片打入字模不同就可以实现

以下是伪代码

//

while(1)

{

for{打入字模}

delay(人眼可以识别的时间,不要太小,会出现鬼影)

}

library IEEE;

use IEEESTD_LOGIC_1164ALL;

use IEEESTD_LOGIC_ARITHALL;

use IEEESTD_LOGIC_UNSIGNEDALL;

ENTITY seg70 IS

PORT (

clk : IN std_logic; --clk 50MHZ

rst : IN std_logic; --REST

dataout : OUT std_logic_vector(7 DOWNTO 0); --各段数据输出

en : OUT std_logic_vector(7 DOWNTO 0)); --COM使能输出

END seg70;

ARCHITECTURE arch OF seg70 IS

signal cnt_scan : std_logic_vector(15 downto 0 ); --计数器分频用

signal data4 : std_logic_vector(2 downto 0);

signal dataout_xhdl1 : std_logic_vector(7 downto 0);

signal en_xhdl : std_logic_vector(7 downto 0);

begin

dataout<=dataout_xhdl1;

en<=en_xhdl;

process(clk,rst)

begin

if(rst='0')then

cnt_scan<="0000000000000000";

elsif(clk'event and clk='1')then

cnt_scan<=cnt_scan+1; --计数器累加

end if;

end process;

process(cnt_scan(15 downto 13)) --计数器分频

begin

case cnt_scan(15 downto 13) is --这里有8种状态,一个状态的时间间隔是一样的。

when"000"=> en_xhdl<="11111110"; --每一次轮流选择一排点阵

when"001"=> en_xhdl<="11111101";

when"010"=> en_xhdl<="11111011";

when"011"=> en_xhdl<="11110111";

when"100"=> en_xhdl<="11101111";

when"101"=> en_xhdl<="11011111";

when"110"=> en_xhdl<="10111111";

when"111"=> en_xhdl<="01111111";

when others=> en_xhdl<="11111110";

end case;

end process;

process(en_xhdl)

begin

case en_xhdl is --每一选择一排灯,同时还要给点阵的数据端口送数据

when "11111110"=> data4<="000";

when "11111101"=> data4<="001";

when "11111011"=> data4<="010";

when "11110111"=> data4<="011";

when "11101111"=> data4<="100";

when "11011111"=> data4<="101";

when "10111111"=> data4<="110";

when "01111111"=> data4<="111";

when others => data4<="111";

end case;

end process;

process(data4)

begin

case data4 is

--给点阵的数据端口送数据

--点阵数据口对应的管脚为1时,那个点不会亮。

--当点阵数据口对应的管脚为0时,那个点会亮。

--下面是一个汉字“正”的点阵码,就是利用点阵的亮和不亮形成对比显示出来的。

WHEN "000" =>

dataout_xhdl1 <= "11111111"; --第一行

WHEN "001" =>

dataout_xhdl1 <= "00000000";

WHEN "010" =>

dataout_xhdl1 <= "11101011";

WHEN "011" =>

dataout_xhdl1 <= "10001011";

WHEN "100" =>

dataout_xhdl1 <= "11101011";

WHEN "101" =>

dataout_xhdl1 <= "11101111";

WHEN "110" =>

dataout_xhdl1 <= "10000001";

WHEN "111" =>

dataout_xhdl1 <= "11111111"; --第八行

WHEN OTHERS =>

dataout_xhdl1 <= "00000011";

END CASE;

END PROCESS;

end arch;

88 LED显示正字

你根据这个来改成0-F显示啊,程序看懂就行。再加个状态机,就可以顺序循环显示了

以上就是关于单片机led点阵的程序怎么写我想修改。用C语言写的、就是怎么样随机选择一组代码。让每次显示的内容都不全部的内容,包括:单片机led点阵的程序怎么写我想修改。用C语言写的、就是怎么样随机选择一组代码。让每次显示的内容都不、LED点阵程序、8×8LED点阵屏仿电梯数字滚动显示 c语言代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9281990.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存